package it.gat.dao.impl;

import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import it.gat.dao.DispositivoSostituitoDAO;
import it.gat.dao.RapportoInterventoDAO;
import it.gat.dao.TicketDAO;
import it.gat.model.RapportoIntervento;
import it.gat.util.dao.MySQLDAOFactory;

public class MySQLRapportoInterventoDAOImpl implements RapportoInterventoDAO {

	@Override
	public RapportoIntervento insert(RapportoIntervento rapportoIntervento) throws SQLException {
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String strDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").format(rapportoIntervento.getOrario());
		String query = "INSERT INTO RapportoIntervento " +
		               "(idTicket,orario,kmPercorsi,durataIntervento) " +
		               "VALUES " +
		               "("+rapportoIntervento.getTicket().getIdTicket()+","+
		               "'"+strDate+"',"+
		               rapportoIntervento.getKmPercorsi()+","+
		               ""+rapportoIntervento.getDurataIntervento()+")";
		stmt.executeUpdate(query);
		query = "SELECT LAST_INSERT_ID()";
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
			rapportoIntervento.setIdRapportoIntervento(rs.getInt("LAST_INSERT_ID()"));
		}
		return rapportoIntervento;
	}

	@Override
	public RapportoIntervento retrieveById(int id) throws SQLException {
		RapportoIntervento rapportoIntervento = new RapportoIntervento();
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "SELECT * " +
		               "FROM rapportointervento " + 
		               "WHERE idrapportointervento = " + id;
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
			rapportoIntervento.setIdRapportoIntervento(rs.getInt("idrapportointervento"));
			rapportoIntervento.setDurataIntervento(rs.getInt("durataintervento"));
			rapportoIntervento.setKmPercorsi(rs.getInt("kmPercorsi"));
			rapportoIntervento.setOrario(rs.getTimestamp("orario"));
			TicketDAO ticketDAO = new MySQLTicketDAOImpl();
			rapportoIntervento.setTicket(ticketDAO.retrieveById(rs.getInt("idticket")));
			DispositivoSostituitoDAO dispositivoSostituitoDAO = new MySQLDispositivoSostituitoDAOImpl();
			rapportoIntervento.setDispositiviSostituiti(dispositivoSostituitoDAO.retriveByIdRapportoIntervento(rs.getInt("idrapportointervento")));
			}
		return rapportoIntervento;
	}

	@Override
	public List<RapportoIntervento> retrieveAll() throws SQLException {
		List<RapportoIntervento> rapportiIntervento = new ArrayList<RapportoIntervento>();
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "SELECT * " +
		               "FROM rapportointervento ";
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
			RapportoIntervento rapportoIntervento = new RapportoIntervento();
			rapportoIntervento.setIdRapportoIntervento(rs.getInt("idrapportointervento"));
			rapportoIntervento.setDurataIntervento(rs.getInt("durataintervento"));
			rapportoIntervento.setKmPercorsi(rs.getInt("kmPercorsi"));
			rapportoIntervento.setOrario(rs.getTimestamp("orario"));
			TicketDAO ticketDAO = new MySQLTicketDAOImpl();
			rapportoIntervento.setTicket(ticketDAO.retrieveById(rs.getInt("idticket")));
			DispositivoSostituitoDAO dispositivoSostituitoDAO = new MySQLDispositivoSostituitoDAOImpl();
			rapportoIntervento.setDispositiviSostituiti(dispositivoSostituitoDAO.retriveByIdRapportoIntervento(rs.getInt("idrapportointervento")));
			rapportiIntervento.add(rapportoIntervento);
			}
		return rapportiIntervento;
	}
	
	@Override
	public List<RapportoIntervento> retrieveCliente(int idCliente) throws SQLException {
		List<RapportoIntervento> rapportiIntervento = new ArrayList<RapportoIntervento>();
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "SELECT * " +
		               "FROM rapportointervento INNER JOIN ticket ON rapportointervento.idticket=ticket.idticket "+
				       "WHERE idCliente="+Integer.toString(idCliente);
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
			RapportoIntervento rapportoIntervento = new RapportoIntervento();
			rapportoIntervento.setIdRapportoIntervento(rs.getInt("idrapportointervento"));
			rapportoIntervento.setDurataIntervento(rs.getInt("durataintervento"));
			rapportoIntervento.setKmPercorsi(rs.getInt("kmPercorsi"));
			rapportoIntervento.setOrario(rs.getTimestamp("orario"));
			TicketDAO ticketDAO = new MySQLTicketDAOImpl();
			rapportoIntervento.setTicket(ticketDAO.retrieveById(rs.getInt("idticket")));
			DispositivoSostituitoDAO dispositivoSostituitoDAO = new MySQLDispositivoSostituitoDAOImpl();
			rapportoIntervento.setDispositiviSostituiti(dispositivoSostituitoDAO.retriveByIdRapportoIntervento(rs.getInt("idrapportointervento")));
			rapportiIntervento.add(rapportoIntervento);
			}
		return rapportiIntervento;
	}

	@Override
	public void update(RapportoIntervento rapportoIntervento) throws SQLException {
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String strDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").format(rapportoIntervento.getOrario());
		String query = "UPDATE RapportoIntervento " +
		               "SET idTicket="+rapportoIntervento.getTicket().getIdTicket()+", "+
		               "orario='"+strDate+"', "+
		               "kmPercorsi="+rapportoIntervento.getKmPercorsi()+", "+
		               "durataIntervento="+rapportoIntervento.getDurataIntervento()+" "+
		               "WHERE idRapportoIntervento=" +rapportoIntervento.getIdRapportoIntervento();
		stmt.executeUpdate(query);

	}

	@Override
	public void delete(int idRapportoIntervento) throws SQLException {
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "DELETE FROM RapportoIntervento " +
		               "WHERE idRapportoIntervento=" +idRapportoIntervento;
		stmt.executeUpdate(query);

	}

}
